package com.study.algorithm.linkedList;

public class AddTwoNumbers {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode dummy = new ListNode(0); // 虚拟头节点，简化操作
        ListNode current = dummy; // 当前指针，用于构建新链表
        int carry = 0; // 进位，初始为0

        // 遍历两个链表，直到两者都为空且无进位
        while (l1 != null || l2 != null || carry != 0) {
            // 获取当前节点的值，如果链表已遍历完则取0
            int l1_val = (l1 != null) ? l1.val : 0;
            int l2_val = (l2 != null) ? l2.val : 0;

            // 计算当前位的和及进位
            int sum = l1_val + l2_val + carry;
            carry = sum / 10; // 更新进位
            int digit = sum % 10; // 当前位的值

            // 将当前位的值存入新链表
            current.next = new ListNode(digit);
            current = current.next;

            // 移动链表指针（如果未遍历完）
            if (l1 != null) l1 = l1.next;
            if (l2 != null) l2 = l2.next;
        }

        return dummy.next; // 返回结果链表的头节点
    }
}
